Amazon QuickSight クロスアカウント移行時の重複アセットインポート検証

Amazon QuickSight クロスアカウント移行時の重複アセットインポート検証

Clock Icon2024.07.09

本記事では、Amazon QuickSight の Assets as Bundle (AaB) 機能を使用して、ダッシュボードとその関連アセットを別の AWS アカウントに移行する際の挙動を検証します。特に、複数のダッシュボードが同じデータセットを共有している場合や、インポート対象のアセットが移行先ですでに存在する場合の動作に焦点を当てています。

アセット移行検証2_ブログ(1)

Icons made by Freepik from Flaticon

AaB 機能は、ダッシュボードとその関連アセット(データセット、分析など)を一括でエクスポート・インポートできる機能です。

検証結果

検証の結果、Assets as Bundle でエクスポートしたアセットに、移行先ですでに存在するアセット(本検証ではデータセット 1)が含まれていても、インポート時にエラーは発生しませんでした。

異なるダッシュボードに同じデータセットを使用している場合でも、"IncludeAllDependencies": true,に設定し関連アセットを丸ごとエクスポート、インポートで移行できます。

アセット移行検証2_ブログ(2)

Icons made by Freepik from Flaticon

QuickSight のアセットに関しては、移行対象のダッシュボードを対象にして、アセットバンドルをエクスポート、インポートでクロスアカウント移行ができます。ただ、移行先のアカウントでデータソースを新たに設定し直すことは必須です。

移行手順

ダッシュボード一式のクロスアカウント移行手順の詳細は、以下のブログで解説しています。

https://dev.classmethod.jp/articles/cross-account-migration-of-amazon-quicksight-dashboard/

本検証では、この手順を基に、同一のデータセットに紐づく別のダッシュボードとその関連アセットの移行を行いました。前回のブログでは単一のダッシュボードの移行を扱いましたが、今回は複数のダッシュボードが同じデータセットを使用している場合の移行方法を確認します。これにより、より複雑な QuickSight 環境での AaB 機能の有効性を検証します。

アセットバンドルのエクスポート

前述の手順に従い、ダッシュボード 2 に関連するアセットバンドルファイルをエクスポートし、ダウンロードしました。

アセット移行検証2_ブログ(3)

Icons made by Freepik from Flaticon

アセットバンドのインポート

エクスポートしたアセットバンドルファイルを用いて、前述の手順に従い以下のコマンドでインポートを実行しました。

IMPORT_JOB_ID="test-import-2"
ASSET_BUNDLE_FILE="assetbundle-test-export-2.qs"
PERMISSIONS_FILE="import-override-permission.json"

aws quicksight start-asset-bundle-import-job \
  --aws-account-id "$TARGET_ACCOUNT_ID" \
  --asset-bundle-import-job-id "$IMPORT_JOB_ID" \
  --asset-bundle-import-source-bytes "fileb://$ASSET_BUNDLE_FILE" \
  --override-permissions "file://$PERMISSIONS_FILE"
import-override-permission.json の内容は長いので折りたたみ
import-override-permission.json
{
    "DataSources": [
        {
            "DataSourceIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"],
                "Actions": [
                    "quicksight:UpdateDataSourcePermissions",
                    "quicksight:DescribeDataSourcePermissions",
                    "quicksight:PassDataSource",
                    "quicksight:DescribeDataSource",
                    "quicksight:DeleteDataSource",
                    "quicksight:UpdateDataSource"
                ]
            }
        }
    ],
    "DataSets": [
        {
            "DataSetIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"],
                "Actions": [
                    "quicksight:DeleteDataSet",
                    "quicksight:UpdateDataSetPermissions",
                    "quicksight:PutDataSetRefreshProperties",
                    "quicksight:CreateRefreshSchedule",
                    "quicksight:CancelIngestion",
                    "quicksight:PassDataSet",
                    "quicksight:ListRefreshSchedules",
                    "quicksight:UpdateRefreshSchedule",
                    "quicksight:DeleteRefreshSchedule",
                    "quicksight:DescribeDataSetRefreshProperties",
                    "quicksight:DescribeDataSet",
                    "quicksight:CreateIngestion",
                    "quicksight:DescribeRefreshSchedule",
                    "quicksight:ListIngestions",
                    "quicksight:DescribeDataSetPermissions",
                    "quicksight:UpdateDataSet",
                    "quicksight:DeleteDataSetRefreshProperties",
                    "quicksight:DescribeIngestion"
                ]
            }
        }
    ],
    "Themes": [
        {
            "ThemeIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"],
                "Actions": [
                    "quicksight:ListThemeVersions",
                    "quicksight:UpdateThemeAlias",
                    "quicksight:DescribeThemeAlias",
                    "quicksight:UpdateThemePermissions",
                    "quicksight:DeleteThemeAlias",
                    "quicksight:DeleteTheme",
                    "quicksight:ListThemeAliases",
                    "quicksight:DescribeTheme",
                    "quicksight:CreateThemeAlias",
                    "quicksight:UpdateTheme",
                    "quicksight:DescribeThemePermissions"
                ]
            }
        }
    ],
    "Analyses": [
        {
            "AnalysisIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"],
                "Actions": [
                    "quicksight:RestoreAnalysis",
                    "quicksight:UpdateAnalysisPermissions",
                    "quicksight:DeleteAnalysis",
                    "quicksight:DescribeAnalysisPermissions",
                    "quicksight:QueryAnalysis",
                    "quicksight:DescribeAnalysis",
                    "quicksight:UpdateAnalysis"
                ]
            }
        }
    ],
    "Dashboards": [
        {
            "DashboardIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"],
                "Actions": [
                    "quicksight:DescribeDashboard",
                    "quicksight:ListDashboardVersions",
                    "quicksight:UpdateDashboardPermissions",
                    "quicksight:QueryDashboard",
                    "quicksight:UpdateDashboard",
                    "quicksight:DeleteDashboard",
                    "quicksight:DescribeDashboardPermissions",
                    "quicksight:UpdateDashboardPublishedVersion",
                    "quicksight:UpdateDashboardLinks"
                ]
            }
        }
    ]
}

実行結果確認

実行結果を確認します。

aws quicksight describe-asset-bundle-import-job --aws-account-id $TARGET_ACCOUNT_ID --asset-bundle-import-job-id $IMPORT_JOB_ID

成功していました。

{
    "Status": 200,
    "JobStatus": "SUCCESSFUL",
    "Arn": "arn:aws:quicksight:ap-northeast-1:111111111111:asset-bundle-import-job/test-import-2",
    "CreatedTime": "2024-07-09T14:17:42+09:00",
    "AssetBundleImportJobId": "test-import-2",
    "AwsAccountId": "111111111111",
    "AssetBundleImportSource": {
        "Body": "https://quicksight-asset-bundle-import-job-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/111111111111/test-import-2/c860072f-abfe-415f-9314-b03530530c07/body.zip?X"
    },
    "FailureAction": "ROLLBACK",
    "RequestId": "4fe51ccc-3750-4ec0-973b-2f5c53888c20",
    "OverridePermissions": {
        "DataSources": [
            {
                "DataSourceIds": [
                    "*"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"
                    ],
                    "Actions": [
                        "quicksight:UpdateDataSourcePermissions",
                        "quicksight:DescribeDataSourcePermissions",
                        "quicksight:PassDataSource",
                        "quicksight:DescribeDataSource",
                        "quicksight:DeleteDataSource",
                        "quicksight:UpdateDataSource"
                    ]
                }
            }
        ],
        "DataSets": [
            {
                "DataSetIds": [
                    "*"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"
                    ],
                    "Actions": [
                        "quicksight:DeleteDataSet",
                        "quicksight:UpdateDataSetPermissions",
                        "quicksight:PutDataSetRefreshProperties",
                        "quicksight:CreateRefreshSchedule",
                        "quicksight:CancelIngestion",
                        "quicksight:PassDataSet",
                        "quicksight:ListRefreshSchedules",
                        "quicksight:UpdateRefreshSchedule",
                        "quicksight:DeleteRefreshSchedule",
                        "quicksight:DescribeDataSetRefreshProperties",
                        "quicksight:DescribeDataSet",
                        "quicksight:CreateIngestion",
                        "quicksight:DescribeRefreshSchedule",
                        "quicksight:ListIngestions",
                        "quicksight:DescribeDataSetPermissions",
                        "quicksight:UpdateDataSet",
                        "quicksight:DeleteDataSetRefreshProperties",
                        "quicksight:DescribeIngestion"
                    ]
                }
            }
        ],
        "Themes": [
            {
                "ThemeIds": [
                    "*"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"
                    ],
                    "Actions": [
                        "quicksight:ListThemeVersions",
                        "quicksight:UpdateThemeAlias",
                        "quicksight:DescribeThemeAlias",
                        "quicksight:UpdateThemePermissions",
                        "quicksight:DeleteThemeAlias",
                        "quicksight:DeleteTheme",
                        "quicksight:ListThemeAliases",
                        "quicksight:DescribeTheme",
                        "quicksight:CreateThemeAlias",
                        "quicksight:UpdateTheme",
                        "quicksight:DescribeThemePermissions"
                    ]
                }
            }
        ],
        "Analyses": [
            {
                "AnalysisIds": [
                    "*"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"
                    ],
                    "Actions": [
                        "quicksight:RestoreAnalysis",
                        "quicksight:UpdateAnalysisPermissions",
                        "quicksight:DeleteAnalysis",
                        "quicksight:DescribeAnalysisPermissions",
                        "quicksight:QueryAnalysis",
                        "quicksight:DescribeAnalysis",
                        "quicksight:UpdateAnalysis"
                    ]
                }
            }
        ],
        "Dashboards": [
            {
                "DashboardIds": [
                    "*"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/AWSReservedSSO_AdministratorAccess_4444444444444c/YasutakaOhmura"
                    ],
                    "Actions": [
                        "quicksight:DescribeDashboard",
                        "quicksight:ListDashboardVersions",
                        "quicksight:UpdateDashboardPermissions",
                        "quicksight:QueryDashboard",
                        "quicksight:UpdateDashboard",
                        "quicksight:DeleteDashboard",
                        "quicksight:DescribeDashboardPermissions",
                        "quicksight:UpdateDashboardPublishedVersion",
                        "quicksight:UpdateDashboardLinks"
                    ]
                }
            }
        ]
    }
}

結果確認

検証の結果、アセットが重複していても問題なくインポートが完了し、ダッシュボード 2 が正常に移行されたことを確認しました。

この結果から、アセットの移行に関してはダッシュボードを対象にして関連アセット含めてエクスポート、インポートするだけで十分であることがわかりました。これにより、複数のダッシュボードが同じデータセットを使用している場合の移行できることが確認できました。

ただし、移行先アカウントでのデータソースの再設定は必須であり、この部分が移行作業の中で最も手間がかかる点であることに注意が必要です。

ダッシュボード2

おわりに

本検証を通じて、QuickSight の Assets as Bundle 機能が、複雑なダッシュボード環境の移行に非常に有効であることが確認できました。特に、アセットの重複を気にせずに移行できる点は大規模な QuickSight 環境の移行に有用です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.